package com.afdor.rws.dtm.annotation;

import com.afdor.rws.dtm.transaction.ExecutionMode;
import com.afdor.rws.dtm.transaction.Isolation;
import com.afdor.rws.dtm.transaction.Propagation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 二阶段分布式事务注解
 *
 * @author 悭梵
 * @date Created in 2018-10-12 11:27
 */
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.TYPE})
public @interface Transaction {

    /**
     * 使用事物管理器的名称
     *
     * @return
     */
    String transactionManager() default "default";

    /**
     * 二阶段分布式事务中本地事务是否开启只读事物
     *
     * @return
     */
    boolean readOnly() default false;

    /**
     * 二阶段分布式事务中本地事务的回滚异常
     *
     * @return
     */
    Class<? extends Throwable>[] rollbackFor() default {};

    /**
     * 二阶段分布式事务中本地事务的不参与回滚异常
     *
     * @return
     */
    Class<? extends Throwable>[] noRollbackFor() default {};

    /**
     * 二阶段分布式事务中本地事务的事务传播性
     *
     * @return {@linkplain Propagation}
     */
    Propagation propagation() default Propagation.REQUIRES_NEW;

    /**
     * 二阶段分布式事务中本地事务的事务隔离级别
     *
     * @return {@linkplain Isolation}
     */
    Isolation isolation() default Isolation.DEFAULT;

    /**
     * 本地事务默认执行方式，默认同步执行（立即调用）。可由调用方覆盖设置。
     *
     * @return
     */
    ExecutionMode executionMode() default ExecutionMode.SYNA;

    /**
     * 事务等待的最大时间 单位秒，默认10分钟
     *
     * @return 多少秒
     */
    int timeout() default 10 * 60 * 1000;


}
